<?php
/**
 * Takes a string and optionally a maximum length and 'cut' the string to match that length, based on words and not on characters.
 *
 * @author kim
 */
class App_View_Helper_Cut extends Zend_View_Helper_Abstract
{
    /**
     * do string cut for string in project
     *
     * @param string  $pStr    The string to be cutted
     * @param intefer $pMaxLen The maximum length to be used to cut the string
     * @return string
     */
    public function cut($pStr, $pMaxLen = 40, $toggleId = false)
    {
        $returnStr = $this->cutstr($pStr, $pMaxLen, ' ...');
        if ($toggleId && (strlen($pStr) > $pMaxLen)) {
            return $this->buildToggleHtml($pStr, $returnStr, $toggleId);
        }
        return $returnStr;
    }

    /**
     * cut string in utf8
     *
     * @param $string - string to cut
     * @param $length - length for cutting
     * @param $dot - the tail added to the sub-string
     * @param $encoding - the encoding of string
     * @return string
     */
    public function cutstr($string, $length, $dot = '', $encoding = 'utf8')
    {
        if (strlen($string) <= $length) {
            return $string;
        }
        $strcut = '';
        if (strtolower($encoding) == 'utf8') {
            $n = $tn = $noc = 0;
            while ($n < strlen($string)) {
                $t = ord($string[$n]);
                if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                    $tn = 1; $n++; $noc++;
                } elseif(194 <= $t && $t <= 223) {
                    $tn = 2; $n += 2; $noc += 2;
                } elseif(224 <= $t && $t < 239) {
                    $tn = 3; $n += 3; $noc += 2;
                } elseif(240 <= $t && $t <= 247) {
                    $tn = 4; $n += 4; $noc += 2;
                } elseif(248 <= $t && $t <= 251) {
                    $tn = 5; $n += 5; $noc += 2;
                } elseif($t == 252 || $t == 253) {
                    $tn = 6; $n += 6; $noc += 2;
                } else {
                    $n++;
                }
                if ($noc >= $length) {
                    break;
                }
            }
            if ($noc > $length) {
                $n -= $tn;
            }
            $strcut = substr($string, 0, $n);
        } else {
            for($i = 0; $i < $length - strlen($dot) - 1; $i++) {
                $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
            }
        }
        return $strcut . $dot;
    }

    /**
     * Builds toggleable block of html
     *
     * @param $fullStr - original content
     * @param $shortStr - cutted content
     * @param $toggleId - content id
     * @return string
     */
    public function buildToggleHtml($fullStr, $shortStr, $toggleId)
    {
        return
<<<HTML
        <div id="{$toggleId}" style="padding:0 0 17px 0; position:relative;" class="cut_helper">
            <span>{$shortStr} </span>
            <a class="show_more" href="javascript:void(0)" onclick="$('#{$toggleId}').hide(); $('#{$toggleId}_full').show()">more</a>
        </div>
        <div id="{$toggleId}_full" style="display: none; padding:0 0 17px 0; position:relative;">
            {$fullStr} 
            <a class="hide_more" href="javascript:void(0)" onclick="$('#{$toggleId}_full').hide(); $('#{$toggleId}').show()">hide</a>
        </div>
HTML;
    }

}
